Factory Providers inject 필드 사용시 유의점 {NestJS.troubleshooting}
Important
- The factory function can accept (optional) arguments.
- The (optional)
inject
property accepts an array of providers that Nest will resolve and pass as arguments to the factory function during the instantiation process. Also, these providers can be marked as optional. The two lists should be correlated: Nest will pass instances from theinject
list as arguments to the factory function in the same order. The example below demonstrates this.
https://docs.nestjs.com/fundamentals/custom-providers#factory-providers-usefactory
inject
프로퍼티는 팩토리 함수의 인자에 들어갈 의존성을 정의하는 배열입니다. NestJS는 inject
배열의 순서대로 팩토리 함수의 인자에 넣습니다.
내가 오해했던 것
inject
배열에 아무 순서, 팩토리 함수의 의존성집합의 상위집합을 넣으면 알아서 돌아가겠지? 매번 똑같은 코드를 작성하면 귀찮으니까 전역변수를 하나 만들어서 똑같이 넣어버렸다.
const policies = [
RedisCachedBlockPolicy,
CourtPolicy,
TicketHistoryPolicy,
TicketPlanPolicy,
TicketPolicy,
CourtBusinessDayPolicy,
CourtUnavailableTimePolicy,
];
@Module({
providers: [
{
provide: 'COMPOSITE_FILTER_COURT_TIME_POLICY',
useFactory: (
cachePolicy: RedisCachedBlockPolicy,
courtPolicy: CourtPolicy,
ticketHistoryPolicy: TicketHistoryPolicy,
ticketPlanPolicy: TicketPlanPolicy,
) =>
new CompositeCourtTimePolicy([
ticketHistoryPolicy,
ticketPlanPolicy,
courtPolicy,
cachePolicy,
]),
inject: policies, // 럭키비키 🎰🎰🎰 ∵ useFactory의 인자 순서가 일치함.
},
{
provide: 'THROUGHOUT_OF_WEEK_POLICY',
useFactory: (
ticketPlanPolicy: TicketPlanPolicy, // <-- RedisCacheBlockPolicy가 주입됨.
courtBusinessDaysPolicy: CourtBusinessDayPolicy, // <-- CourtPolicy가 주입됨.
) =>
new ThroughoutOfWeekPolicy([ticketPlanPolicy, courtBusinessDaysPolicy]),
inject: policies, // 💀💀💀💀💀💀💀💀
},
]
})
대안
아래와 같이 inject 프로퍼티에 직접 의존성을 넣는 수밖에 없을듯.
{
provide: 'THROUGHOUT_OF_WEEK_POLICY',
useFactory: (
ticketPlanPolicy: TicketPlanPolicy,
courtBusinessDaysPolicy: CourtBusinessDayPolicy,
) =>
new ThroughoutOfWeekPolicy([ticketPlanPolicy, courtBusinessDaysPolicy]),
inject: [TicketPlanPolicy, CourtBusinessDayPolicy],
},